import { defineStore } from "pinia";
import { store } from "../index";
import { cloneDeep } from "lodash-es";
import remainingRouter from "@/router/modules/remaining";
import { flatMultiLevelRoutes, generateRoute } from "@/utils/routerHelper";
import { CACHE_KEY, useCache } from "@/hooks/web/useCache";

const { wsCache } = useCache();

export interface PermissionState {
    routers: AppRouteRecordRaw[];
    addRouters: AppRouteRecordRaw[];
    menuTabRouters: AppRouteRecordRaw[];
}

export const usePermissionStore = defineStore("permission", {
    state: (): PermissionState => ({
        routers: [],
        addRouters: [],
        menuTabRouters: []
    }),
    getters: {
        getRouters(): AppRouteRecordRaw[] {
            return this.routers;
        },
        getAddRouters(): AppRouteRecordRaw[] {
            return flatMultiLevelRoutes(cloneDeep(this.addRouters));
        },
        getMenuTabRouters(): AppRouteRecordRaw[] {
            return this.menuTabRouters;
        }
    },
    actions: {
        async generateRoutes(): Promise<unknown> {
            return new Promise<void>(async (resolve) => {
                // 获得菜单列表，它在登录的时候，setUserInfoAction 方法中已经进行获取
                let res: AppCustomRouteRecordRaw[];
                if (wsCache.get(CACHE_KEY.ROLE_ROUTERS)) {
                    res = wsCache.get(CACHE_KEY.ROLE_ROUTERS) as AppCustomRouteRecordRaw[];
                }
                const routerMap: AppRouteRecordRaw[] = generateRoute(res as AppCustomRouteRecordRaw[]);
                // 动态路由，404一定要放到最后面
                this.addRouters = routerMap.concat([
                    {
                        path: "/:path(.*)*",
                        redirect: "/404",
                        name: "404Page",
                        meta: {
                            hidden: true,
                            breadcrumb: false
                        }
                    }
                ]);
                // 渲染菜单的所有路由
                this.routers = cloneDeep(remainingRouter).concat(routerMap);
                resolve();
            });
        },
        setMenuTabRouters(routers: AppRouteRecordRaw[]): void {
            this.menuTabRouters = routers;
        }
    }
});

export const usePermissionStoreWithOut = () => {
    return usePermissionStore(store);
};
